package com.atwulidun.iterator15;

import java.util.List;

// 定义一个迭代器接口
public interface Iterator {
    boolean hasNext();
    Object next();
    void remove();
}

// 迭代器接口的实现类
class ConcretIterator implements Iterator {
    // 维护一个数据结构，由构造器传入
    private List<Object> list;
    // 当前元素的下标
    private int curIndex;
    // 当前元素的上一个元素的下标
    private int preIndex = -1;

    public ConcretIterator(List<Object> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        // 遍历到最后一个元素，curIndex == list.size() - 1，此时还是返回true的
        // 之后会对curIndex进行+1操作，此时curIndex == list.size()，返回false
        return curIndex != list.size();
    }

    @Override
    public Object next() {
        if (hasNext()) {
            // 调用一次next()方法，则前一个元素的下标就用当前元素的下标替代
            preIndex = curIndex;
            // 当前元素的下标要自增指向当前元素的下一个元素
            curIndex++;
            // 返回的实际上还是当前元素
            return list.get(preIndex);
        }
        return null;
    }

    @Override
    // remove()方法的调用是在调用了一次next()方法后紧接着调用，并且只能调用一次
    // 再次调用remove()方法需要再先调用一次next()方法，连续两次调用next()方法会报错
    public void remove() {
        // 因为remove()方法是在调用了一次next()方法后删除，因此相当于删的是当前的元素
        list.remove(preIndex);
        // 特别注意：删除当前元素后，curIndex往前移动一位
        curIndex = preIndex;
        // 将preIndex重置，因为再调用下一次next()的时候会对preIndex重新赋值
        preIndex = -1;
    }
}
